package com.qvtu.poetry.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qvtu.poetry.entry.Poem;
import com.qvtu.poetry.entry.Result;
import com.qvtu.poetry.entry.dto.*;
import com.qvtu.poetry.service.PoemService;
import com.qvtu.poetry.utils.ThreadLocalUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/poem")
public class PoemController {

    @Autowired
    private PoemService poemService;

    /**
     * 诗歌分页搜索（POST + JSON）。公共接口，无需登录。
     * 填写说明：
     * - keyword：模糊匹配 标题/内容/主题关键词/风格，可空。
     * - styleType：风格，传 "全部" 或不传表示不按风格筛选。
     * - themeKeyword：主题关键字，模糊匹配，可空。
     * - startTime/endTime：创建时间范围，格式 yyyy-MM-dd'T'HH:mm:ss，例如 2025-01-01T00:00:00。
     * - minLikes：最小点赞数阈值，默认 0 表示不限。
     * - pageNum/pageSize：分页参数，默认 1 / 9。
     * - order：排序，可选值：默认/default、最新发布/latest、点赞最多/likes、热度/hot、分享/share。
     * <p>
     * 示例 JSON：
     * {
     * "keyword": "春",
     * "styleType": "唐诗",
     * "themeKeyword": "花",
     * "startTime": "2025-01-01T00:00:00",
     * "endTime": "2025-12-31T23:59:59",
     * "minLikes": 10,
     * "order": "点赞最多",
     * "pageNum": 1,
     * "pageSize": 9
     * }
     *
     * @param dto 搜索与分页参数
     * @return 分页结果：total/pages/current/size/records
     */
    @PostMapping("/search")
    public Result<Map<String, Object>> search(@RequestBody(required = false) PoemSearchDTO dto) {
        // 前端不传或传空参时，设置安全的默认查询条件
        if (dto == null) {
            dto = new PoemSearchDTO();
            dto.setPageNum(1);
            dto.setPageSize(9);
            dto.setMinLikes(0);
            dto.setOrder("default");
        } else {
            if (dto.getPageNum() == null || dto.getPageNum() <= 0) dto.setPageNum(1);
            if (dto.getPageSize() == null || dto.getPageSize() <= 0) dto.setPageSize(9);
            if (dto.getMinLikes() == null) dto.setMinLikes(0);
            if (dto.getOrder() == null || dto.getOrder().isBlank()) dto.setOrder("default");
        }
        Page<Poem> result = poemService.searchPage(dto);
        Map<String, Object> resp = Map.of(
                "total", result.getTotal(),
                "pages", result.getPages(),
                "current", result.getCurrent(),
                "size", result.getSize(),
                "records", result.getRecords()
        );
        return Result.success(resp);
    }

    /**
     * 新增诗歌（需要登录）
     *
     * @param poemAddDTO 诗歌信息
     * @return 操作结果
     */
    @PostMapping(value = "/add", produces = "application/json;charset=utf-8")
    public Result<String> add(@Valid @RequestBody PoemAddDTO poemAddDTO) {
        // 从ThreadLocal中获取用户信息
        Map<String, Object> userInfo = ThreadLocalUtil.get();
        Long userId = Long.valueOf(userInfo.get("userId").toString());

        // 统计用户已有的诗歌数量
        int poemCount = poemService.countUserPoems(userId);

        // 判断是否超过30首诗歌的限制
        if (poemCount >= 30) {
            return Result.error("超过三十首");
        }

        // 调用service层方法保存诗歌
        boolean success = poemService.addPoem(userId, poemAddDTO);

        if (success) {
            return Result.success("添加成功");
        } else {
            return Result.error("添加失败");
        }
    }

    /**
     * 生成诗歌（POST + JSON）。公共接口，无需登录。
     * 请求体字段见 PoemCreateDTO。
     * 返回结构：PoemGenerateResp（title 标题，content 正文，params 原始入参）。
     */
    @PostMapping(value = "/create", produces = "application/json;charset=utf-8")
    public Result<PoemGenerateResp> create(@RequestBody PoemCreateDTO req) {
        PoemGenerateResp resp = poemService.generatePoemStructured(req);
        return Result.success(resp);
    }

    /**
     * 获取诗歌详情（GET）。
     * 根据ID返回已发布的诗歌详情；未发布或不存在则返回错误。
     */
    @GetMapping("/detail/{id}")
    public Result<Poem> detail(@PathVariable Long id) {
        Poem poem = poemService.getPublishedById(id);
        if (poem == null) {
            return Result.error("诗歌不存在或未发布");
        }
        return Result.success(poem);
    }

    /**
     * 分页搜索已发布的诗歌列表，并返回用户对每首诗歌的点赞、收藏状态及点赞总数
     * 支持的搜索条件：keyword、styleType、themeKeyword、时间范围、最小点赞数、排序等
     * 同时保留根据userId查询用户操作状态的功能
     */
    @PostMapping("/list")
    public Result<Page<PoemWithUserActionDTO>> list(@RequestBody(required = false) PoemListDTO dto) {
        // 调用service方法，传入搜索条件和用户ID
        Page<PoemWithUserActionDTO> page = poemService.searchPageWithUserAction(dto);
        return Result.success(page);
    }

    /**
     * 获取当前用户所有非删除状态的诗歌（GET，需登录）
     * 从token中获取userId，查询该用户除删除以外的所有诗歌
     */
    @GetMapping("/user/all")
    public Result<List<Poem>> getUserPoems() {
        // 从ThreadLocal中获取用户信息
        Map<String, Object> userInfo = ThreadLocalUtil.get();
        Long userId = Long.valueOf(userInfo.get("userId").toString());

        // 调用service层方法查询用户非删除状态的所有诗歌
        // 由于现有service没有直接提供不分页查询的方法，我们使用pageSize设置为一个较大的值来获取所有诗歌
        Page<Poem> result = poemService.listUserPage(userId, 1, Integer.MAX_VALUE, null);
        List<Poem> poems = result.getRecords();

        return Result.success(poems);
    }
}